<?php

# -- DÉBUT NOTE DE LICENCE -------------------------------------
#
# Ce fichier fait partie du plugin «Développeur» pour Clicpage.
#
# Copyright (c) 2010 Francois (www.clicpage.net)
# Distribué selon les termes de la licence GPL version 2.0.
# Consultez le fichier LICENCE ou
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
#
# -- FIN NOTE DE LICENCE ---------------------------------------

class pDevServiceAdmin
{
	
	private static function checkGeneral()
	{
		
		if(empty($_POST['module_titre'])) {
			throw new cpErreur(__('Vous devez indiquer un titre.'), 'module_titre', 101);
		}
		
		if(empty($_POST['module_id'])) {
			throw new cpErreur(__('Vous devez indiquer un identifiant.'), 'module_id', 101);
		}
		
		if(strpos($_POST['module_id'], "'") !== false || strpos($_POST['module_id'], '"') !== false) {
			throw new cpErreur(__('L\'identifiant contient des caractères interdits.'), 'module_id', 110);
		}
		
		$_POST['module_id'] = text::str2URL($_POST['module_id']);
		
		if(strpos($_POST['module_id'], '/') !== false || strpos($_POST['module_id'], '\\') !== false) {
			throw new cpErreur(__('L\'identifiant contient des caractères interdits.'), 'module_id', 110);
		}
		
		if(empty($_POST['module_description'])) {
			throw new cpErreur(__('Vous devez indiquer une description.'), 'module_description', 101);
		}
		
		if(empty($_POST['module_auteur'])) {
			throw new cpErreur(__('Vous devez indiquer un auteur.'), 'module_auteur', 101);
		}
		
	}
	
	public static function creerPlugin()
	{
		
		self::checkGeneral();
		
		if(empty($_POST['module_priorite']) || !is_numeric($_POST['module_priorite'])) {
			$_POST['module_priorite'] = 500;
		}
		
		$dest = path::clean(CP_CHEMIN_PLUGINS.'/'.$_POST['module_id']);
		
		if(is_dir($dest)) {
			throw new cpErreur(__('Cet identifiant est déjà utilisé.'), 'module_id', 102);
		}
		
		if(!is_writable(CP_CHEMIN_PLUGINS)) {
			throw new cpErreur(__('La destination n\'est pas accessible en écriture.'), null, 401);
		}
		
		# Générateurs de page
		$generateurs = array();
		if(is_array($_POST['generateurs_i']))
		{
			foreach($_POST['generateurs_i'] as $i)
			{
				if(empty($_POST['generateur_'.$i.'_titre'])) {
					throw new cpErreur(__('Vous devez indiquer un titre.'), 'generateur_'.$i.'_titre', 101);
				}
				
				if(empty($_POST['generateur_'.$i.'_identifiant'])) {
					throw new cpErreur(__('Vous devez indiquer un identifiant.'), 'generateur_'.$i.'_identifiant', 101);
				}
				
				$_POST['generateur_'.$i.'_identifiant'] = text::str2URL($_POST['generateur_'.$i.'_identifiant']);
				
				if(strpos($_POST['generateur_'.$i.'_identifiant'], '/') !== false || strpos($_POST['generateur_'.$i.'_identifiant'], '\\') !== false) {
					throw new cpErreur(__('L\'identifiant contient des caractères interdits.'), 'generateur_'.$i.'_identifiant', 110);
				}
				
				if(array_key_exists($_POST['generateur_'.$i.'_identifiant'], $generateurs)) {
					throw new cpErreur(__('Cet identifiant est déjà utilisé.'), 'generateur_'.$i.'_identifiant', 102);
				}
				
				if(empty($_POST['generateur_'.$i.'_description'])) {
					throw new cpErreur(__('Vous devez indiquer une description.'), 'generateur_'.$i.'_description', 101);
				}
				
				$generateurs[$_POST['generateur_'.$i.'_identifiant']] = array(
					'titre' => $_POST['generateur_'.$i.'_titre'],
					'identifiant' => $_POST['generateur_'.$i.'_identifiant'],
					'description' => $_POST['generateur_'.$i.'_description']
				);
			}
		}
		
		# Gadgets
		$gadgets = array();
		if(is_array($_POST['gadgets_i']))
		{
			foreach($_POST['gadgets_i'] as $i)
			{
				if(empty($_POST['gadget_'.$i.'_titre'])) {
					throw new cpErreur(__('Vous devez indiquer un titre.'), 'gadget_'.$i.'_titre', 101);
				}
				
				if(empty($_POST['gadget_'.$i.'_identifiant'])) {
					throw new cpErreur(__('Vous devez indiquer un identifiant.'), 'gadget_'.$i.'_identifiant', 101);
				}
				
				$_POST['gadget_'.$i.'_identifiant'] = text::str2URL($_POST['gadget_'.$i.'_identifiant']);
				
				if(strpos($_POST['gadget_'.$i.'_identifiant'], '/') !== false || strpos($_POST['gadget_'.$i.'_identifiant'], '\\') !== false) {
					throw new cpErreur(__('L\'identifiant contient des caractères interdits.'), 'gadget_'.$i.'_identifiant', 110);
				}
				
				if(array_key_exists($_POST['gadget_'.$i.'_identifiant'], $gadgets)) {
					throw new cpErreur(__('Cet identifiant est déjà utilisé.'), 'gadget_'.$i.'_identifiant', 102);
				}
				
				if(empty($_POST['gadget_'.$i.'_description'])) {
					throw new cpErreur(__('Vous devez indiquer une description.'), 'gadget_'.$i.'_description', 101);
				}
				
				$gadgets[$_POST['gadget_'.$i.'_identifiant']] = array(
					'titre' => $_POST['gadget_'.$i.'_titre'],
					'identifiant' => $_POST['gadget_'.$i.'_identifiant'],
					'description' => $_POST['gadget_'.$i.'_description']
				);
			}
		}
		
		# Filtres antispam
		$antispams = array();
		if(is_array($_POST['antispams_i']))
		{
			foreach($_POST['antispams_i'] as $i)
			{
				if(empty($_POST['antispam_'.$i.'_titre'])) {
					throw new cpErreur(__('Vous devez indiquer un titre.'), 'antispam_'.$i.'_titre', 101);
				}
				
				if(empty($_POST['antispam_'.$i.'_identifiant'])) {
					throw new cpErreur(__('Vous devez indiquer un identifiant.'), 'antispam_'.$i.'_identifiant', 101);
				}
				
				$_POST['antispam_'.$i.'_identifiant'] = text::str2URL($_POST['antispam_'.$i.'_identifiant']);
				
				if(strpos($_POST['antispam_'.$i.'_identifiant'], '/') !== false || strpos($_POST['antispam_'.$i.'_identifiant'], '\\') !== false) {
					throw new cpErreur(__('L\'identifiant contient des caractères interdits.'), 'antispam_'.$i.'_identifiant', 110);
				}
				
				if(array_key_exists($_POST['antispam_'.$i.'_identifiant'], $antispams)) {
					throw new cpErreur(__('Cet identifiant est déjà utilisé.'), 'antispam_'.$i.'_identifiant', 102);
				}
				
				if(empty($_POST['antispam_'.$i.'_description'])) {
					throw new cpErreur(__('Vous devez indiquer une description.'), 'antispam_'.$i.'_description', 101);
				}
				
				$antispams[$_POST['antispam_'.$i.'_identifiant']] = array(
					'titre' => $_POST['antispam_'.$i.'_titre'],
					'identifiant' => $_POST['antispam_'.$i.'_identifiant'],
					'description' => $_POST['antispam_'.$i.'_description']
				);
			}
		}
		
		# Création du dossier du plugin
		files::makeDir($dest);
		
		# Création de 'description.php'
		file_put_contents($dest.'/description.php', "<?php

\$this->initialiserPlugin(
	/* Nom */				'".addslashes($_POST['module_titre'])."',
	/* Description*/		'".addslashes($_POST['module_description'])."',
	/* Auteur */			'".addslashes($_POST['module_auteur'])."',
	/* Version */			'1.0.0',
	/* Priorité */			".(integer) $_POST['module_priorite']."
);

?>");
		
		# Création de '_installer.php'
		file_put_contents($dest.'/_installer.php', "<?php

\$version = \$core->getVersion('plugin', '".addslashes($_POST['module_id'])."');

if(!\$version || version_compare(\$version, '1.0.0', '<') == 1) {

	# Version
	\$core->setVersion('plugin','".addslashes($_POST['module_id'])."','1.0.0');
	
	return true;
	
}

?>");
		
		
		# Création de '_prepend.php'
		$prepend = '';
		
		foreach($generateurs as $generateur)
		{
			$prepend.="\$core->initialiserGenerateur(
	/* Identifiant */	'".addslashes($generateur['identifiant'])."',
	/* Nom */			__('".addslashes($generateur['titre'])."'),
	/* Description */	__('".addslashes($generateur['description'])."'),
	/* Dossier */		dirname(__FILE__).'/generateurs/".addslashes($generateur['identifiant'])."'
);

";
		}
		
		foreach($gadgets as $gadget)
		{
			$prepend.="\$core->initialiserGadget(
	/* Identifiant */	'".addslashes($gadget['identifiant'])."',
	/* Nom */			__('".addslashes($gadget['titre'])."'),
	/* Description */	__('".addslashes($gadget['description'])."'),
	/* Dossier */		dirname(__FILE__).'/gadgets/".addslashes($gadget['identifiant'])."'
);

";
		}
		
		foreach($antispams as $antispam)
		{
			$prepend.="\$core->initialiserAntispam(
	/* Identifiant */	'".addslashes($antispam['identifiant'])."',
	/* Nom */			__('".addslashes($antispam['titre'])."'),
	/* Description */	__('".addslashes($antispam['description'])."'),
	/* Dossier */		dirname(__FILE__).'/antispams/".addslashes($antispam['identifiant'])."'
);

";
		}
		
		if(!empty($prepend)) {
			$prepend = "<?php\n\n".$prepend.'?>';
		} elseif($_POST['fichier_prepend'] == '1') {
			$prepend = "<?php\n\n?>";
		}
		
		if(!empty($prepend)) {
			file_put_contents($dest.'/_prepend.php', $prepend);
		}
		
		# Création du fichier '_admin.php'
		if($_POST['fichier_admin'] == '1') {
			file_put_contents($dest.'/_admin.php', "<?php\n\n?>");
		}
		
		# Création du fichier '_public.php'
		if($_POST['fichier_public'] == '1') {
			file_put_contents($dest.'/_public.php', "<?php\n\n?>");
		}
		
		# Création des générateurs
		foreach($generateurs as $generateur)
		{
			
			files::makeDir($dest.'/generateurs/'.$generateur['identifiant']);
			
			file_put_contents($dest.'/generateurs/'.$generateur['identifiant'].'/page.php', "<?php

	class generateur".$generateur['identifiant']." extends cpGenerateur
	{
	
	
	
	
	
		/// @name Administration
		//@{
	
		
		public function preparerModule(\$module)
		{
		
			# Vérification des permissions
			if(	\$this->core->auth->verifierPermission('pages') &&
				(\$this->page->utilisateur_id == \$this->core->auth->getUtilisateurID() ||
				 \$this->core->auth->verifierPermission('toutesPages') )
			)
			{
				
				# Boutons d'action
				if(\$this->core->auth->verifierPermission('publierPage')) {
					\$module->ajouterBoutonAction(__('Publier'), '#', 'boutonAction_publier');
				}
				\$module->ajouterBoutonAction(__('Enregistrer comme brouillon'), '#', 'boutonAction_enregistrer');
				
				# Actions autorisées
				\$module->setActionsAutorisees('enregistrerPage', 'publierPage', 'restaurerPage');
				
			}
		
		}
		
		
		public function action_enregistrerPage(\$module)
		{
			# Insérez ici le code permettant d'enregistrer
			# un brouillon de la page.
		}
		
		
		public function action_publierPage(\$module)
		{
			
			# Permission nécessaire: publierPage
			\$this->core->auth->verifierPermission('publierPage', true);
			
			\$this->page->page_options['nouveau'] = false;
			\$this->action_enregistrerPage(\$module);
			\$this->page->publier();
			
			\$module->messageOK(__('La page a été publiée avec succès.'));
			
		}
		
		
		public function action_restaurerPage(\$module)
		{
			\$this->page->restaurer();
			\$module->messageOK(__('La page a été restaurée avec succès.'));
		}
	

		public function adminBody(\$module)
		{
			return \'<p>Aucun module d\'administration n\'a été créé pour ce générateur.</p>\'.
			'<p>Pour savoir comment en créer un, consultez la documentation de Clicpage.</p>';
		}
		
		
		public function curseurNouvellePage(\$cur)
		{
			\$cur->page_options = serialize(array(
				'format' 			=> CP_FORMAT_XHTML, 
				'affiche_meta' 		=> true,
				'affiche_tags'		=> true,
				'nouveau'			=> true
			));
			\$cur->page_mots = implode(' ', text::splitWords(text::toUTF8(html_entity_decode(html::clean(\$cur->page_titre)))));
		}
		//@}
		
		
		
		
		
		/// @name Public
		//@{
		
		
		public function affiche_meta()
		{
			return \$this->page->page_options['affiche_meta'];
		}
		
		
		public function affiche_tags()
		{
			return \$this->page->page_options['affiche_tags'];
		}
		//@}
		
		
	}
			
?>");
			
		}
		
		# Création des gadgets
		foreach($gadgets as $gadget)
		{
			
			files::makeDir($dest.'/gadgets/'.$gadget['identifiant']);
			
			file_put_contents($dest.'/gadgets/'.$gadget['identifiant'].'/gadget.php', "<?php

class gadget".$gadget['identifiant']." extends cpGadget
{
	
	



	/// @name Administration
	//@{
	
	
	public function adminInterface()
	{
		
		\$html =
			\'<p>Aucun module d\'administration n\'a été créé pour ce générateur.</p>\'.
			'<p>Pour savoir comment en créer un, consultez la documentation de Clicpage.</p>';
		
		return array(
			'html' => \$html,
			'javascript' => ''
		);
		
	}

	
	public function preparerInstData(\$data)
	{
		# Insérez ici un code générant une chaîne de caractères
		# qui sera écrite dans le champ gadget_inst_data de la base
		# de données lorsque l'utilisateur enregistrera le gadget.
		
		# Vous pouvez utiliser la fonction serialize() de PHP pour
		# enregistrer plusieurs données dans ce champ.
		
		# \$data est un tableau rassemblant toutes les informations
		# recueillies dans le formulaire de configuration du gadget.		
	}
	//@}
	

	
	
	
	/// @name Public
	//@{
	
	public function public_contenu()
	{
	
		# Insérez ici le code gérant l'affichage du
		# gadget côté public.
	
		return '<p>Contenu du gadget</p>';
		
	}
	//@}

	
}

?>");

		}
		
		
		# Création des filtres antispam
		foreach($antispams as $antispam)
		{
			
			files::makeDir($dest.'/antispams/'.$antispam['identifiant']);
			
			file_put_contents($dest.'/antispams/'.$antispam['identifiant'].'/antispam.php', "<?php

	class antispam".$antispam['identifiant']." extends cpAntispam
	{
	
	
		public function estIndesirable(\$auteur, \$email, \$ip, \$titre, \$contenu, \$page_id, &\$details)
		{
			
			# Cette fonction doit returner 'true' si elle juge que
			# le commentaire est indésirable.
			
			return;
	
		}
		
		
		public static function installer(\$core)
		{		
			\$core->site->setStatutAntispam(\'".$antispam['identifiant']."\', true);
		}
		
		
		public function moduleAdmin()
		{
			# Si le filtre antispam possède une module d'administration,
			# cette fonction doit retourner l'identifiant de ce module.
			return false;
		}
		
		
	}			
			
?>");

		}
		
		return array(
			'erreur'		=> 0,
			'repertoire'	=> $dest.'/'
		);
		
	}
	
	public static function creerTheme()
	{
		
		self::checkGeneral();
		
		if(empty($_POST['template'])) {
			throw new cpErreur(__('Vous devez choisir un modèle.'), 'template', 101);
		}
		
		if(!in_array($_POST['template'], array('gadgetsboth', 'gadgetsgauche', 'gadgetsdroite'))) {
			throw new cpErreur(__('Donnée invalide'), 'template', 103);
		}
		
		$dest = path::clean(CP_CHEMIN_THEMES.'/'.$_POST['module_id']);
		
		if(is_dir($dest)) {
			throw new cpErreur(__('Cet identifiant est déjà utilisé.'), 'module_id', 102);
		}
		
		if(!is_writable(CP_CHEMIN_THEMES)) {
			throw new cpErreur(__('La destination n\'est pas accessible en écriture.'), null, 401);
		}
		
		# Création du dossier du thème
		files::makeDir($dest);
		files::makeDir($dest.'/images');
		files::makeDir($dest.'/styles');
		
		$src = CP_CHEMIN_PLUGINS.'/dev/templates/'.$_POST['template'];

		# Création de 'description.php'
		file_put_contents($dest.'/description.php', "<?php

\$this->initialiserTheme(
	/* Nom */				'".addslashes($_POST['module_titre'])."',
	/* Description*/		'".addslashes($_POST['module_description'])."',
	/* Auteur */			'".addslashes($_POST['module_auteur'])."',
	/* Version */			'1.0.0'
);

?>");
		
		# Création de 'theme.php'
		file_put_contents($dest.'/theme.php', str_replace('{{themeID}}', $_POST['module_id'], file_get_contents($src.'/theme.php')));
		
		# Copie des fichiers
		copy($src.'/styles/custom.css', $dest.'/styles/custom.css');
		copy($src.'/styles/styles.css', $dest.'/styles/styles.css');
		copy($src.'/styles/wysiwyg.css', $dest.'/styles/wysiwyg.css');
		copy($src.'/apercu.jpg', $dest.'/apercu.jpg');
		copy($src.'/page.html', $dest.'/page.html');

		return array(
			'erreur'		=> 0,
			'repertoire'	=> $dest.'/'
		);
		
	}
	
}

?>